#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>

#define NUM 1024;
char cmd_line[1024];
#define SEP " "
#define SIZE 32

char*g_argv[32];

//实现总结
//1. 运行的本质：创建子进程，子进程负责执行命令，父进程负责等待子进程执行结果
//2. 执行命令之前，需要获取命令和解析命令（详细过程如下）
//3. 获取命令利用fgets从键盘上获取相应命令；获取命令后再使用分割函数将命令进行分割
//4. 分割后的命令，交给子进程去执行，从而实现分批执行的效果
int main()
{
  //命令解释器
  while(1)
  {
    printf("[myshell]#");
    //刷新缓冲区，将缓冲区的数据输出到设备
    fflush(stdout);
    memset(cmd_line,'\0',sizeof cmd_line);

    //获取用户键盘上输入的指令
    if(fgets(cmd_line,sizeof cmd_line,stdin)==NULL)
    {
      continue;
    }
    //防止打印提示符时出现换行情况
    cmd_line[strlen(cmd_line)-1] = '\0';
    printf("echo:%s\n",cmd_line);

    //命令行中的字符串解析
    g_argv[0] = strtok(cmd_line,SEP);
    int index = 1;

    while(g_argv[index++]=strtok(NULL,SEP));
    
    //内置命令（如果子进程不执行，则由父进程执行）
    if(strcmp(g_argv[0],"cd")==0)
    {
      if(g_argv[1]!=NULL) chdir(g_argv[1]);
      continue;
    }


    pid_t id = fork();
    if(id == 0)
    {
      printf("子进程实现的功能：\n");
      execvp(g_argv[0],g_argv);
      exit(1);
    }
    int status = 0;
    pid_t ret = waitpid(id,&status,0);
    if(ret>0) printf("esit code:%d\n",WEXITSTATUS(status));
  }
  return 0;
}
